/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.server.services;

import co.com.ces4.produccion.client.UsuarioService;
import co.com.ces4.produccion.jpa.controllers.UsuarioJpaController;
import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Sebastian
 */
public class UsuarioServiceImpl extends RemoteServiceServlet implements UsuarioService {

    public void guardarUsuario(Usuario usuario) throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        try {
            usuarioJpaController.create(usuario);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "El usuario no pudo ser guardado debido a que ya ha sido creado anteriormente" + ex.getMessage());
            throw new RuntimeException("El usuario ya se encuentra registrado en la base de datos, por tanto no pudo ser almacenado");
        } catch (Exception ex) {
            Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
            throw new RuntimeException("Ocurri&oacute; un error inesperado al intentar guardar el usuario en la base de datos");
        }
    }

    public void actualizarUsuario(Usuario usuario) throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        try {
            usuarioJpaController.edit(usuario);
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
            throw new RuntimeException("Ocurri&oacute; un error inesperado al intentar actualizar el usuario en la base de datos", ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "El usuario que se intenta actualizar no existe en la base de datos" + ex.getMessage());
            throw new RuntimeException("El usuario no se encuentra registrado en la base de datos, por tanto no pudo ser actualizado");
        } catch (Exception ex) {
            Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
            throw new RuntimeException("Ocurri&oacute; un error inesperado al intentar actualizar el usuario en la base de datos");
        }
    }

    public List<Usuario> getUsuarios() throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        return usuarioJpaController.findUsuarioEntities();
    }

    public List<Usuario> getUsuarioList(String id, String nombre, String login, Boolean activo) throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        return usuarioJpaController.getUsuarioList(id, nombre, login, activo);
    }

    public Usuario getUsuarioXId(String id) throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        return usuarioJpaController.findUsuario(id);
    }

    public void desactivarUsuarios(List<Usuario> usuarios) throws RuntimeException {
        UsuarioJpaController usuarioJpaController = (UsuarioJpaController) getServletContext().getAttribute("usuarioJpaController");
        for (Usuario usuario : usuarios) {
            usuario.setSnestado(false);
            try {
                usuarioJpaController.edit(usuario);
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "Registro no encontrado en la base de datos:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, el usuario no se encuentra registrado en la base de datos, por tanto no pudo ser desactivado");
            } catch (Exception ex) {
                Logger.getLogger(UsuarioServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            }
        }
    }
}
